package com.example.lt.service.video;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.lt.entity.queryPage.BasePage;
import com.example.lt.entity.video.HotVideo;
import com.example.lt.entity.video.Video;
import com.example.lt.entity.video.VideoShare;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * @Author 小涛Tao
 * @Date: 2024/07/29/21:24
 * version 1.0 注释：
 **/
public interface VideoService extends IService<Video> {

    /**
     * 发布/修改视频
     * 修改无法更换视频源
     * @param video 视频信息
     */
    void publishVideo(Video video);

    /**
     * 获取视频信息
     * @param id 视频id
     * @param userId 当前用户
     * @return
     */
    Video getVideoById(Long id, Long userId);

    /**
     * 用户获取推送视频
     * @param userId 用户id
     * @return
     */
    Collection<Video> pushVideos(Long userId);

    /**
     * 以用户拉取模式来初始用户的收件箱
     * @param userId 用户id
     * @return
     */
    void initFollowFeed(Long userId);

    /**
     * 关注流
     * @param userId 用户id
     * @param lastTime 滚动分页参数，首次为 now Data()，后续为上次的末尾视频时间
     * @return
     */
    Collection<Video> followFeed(Long userId, Long lastTime);

    /**
     * 获取当前审核队列是快还是慢
     * @return
     */
    String getAuditQueueState();

    /**
     * 查询用户所管理的视频
     * @param basePage 分页信息
     * @return
     */
    IPage<Video> listByUserIdVideo(BasePage basePage, Long userId);

    /**
     * 根据用户id分页获取视频，只包含公开的视频
     * @param userId 用户id
     * @param basePage 分页信息
     * @reture
     */
    IPage<Video> listByUserIdOpenVideo(Long userId, BasePage basePage);

    /**
     * 获取用户 userId 所有公开视频的id集合
     * @param userId 用户id
     * @return
     */
    List<Long> listVideoIdByUserId(Long userId);

    /**
     * 根据分类获取视频，乱序获取
     * @param typeId 分类id
     * @return
     */
    Collection<Video> getVideosByTypeId(Long typeId);

    /**
     * 用户 收藏/取消收藏 视频
     * @param favoritesId
     * @param videoId
     * @return
     */
    boolean favoritesVideo(Long favoritesId, Long videoId);

    /**
     * 获取收藏夹下的视频
     * @param favoriteId 收藏夹id
     * @return
     */
    Collection<Video> listVideoByFavorites(Long favoriteId);

    /**
     * 用户点赞
     * @param videoId
     * @return
     */
    boolean starVideo(Long videoId);

    /**
     * 添加视频浏览记录到 redis 中
     * @param videoId 视频id
     * @param userId 用户id
     */
    void historyVideo(Long videoId, Long userId);

    /**
     * 获取当前用户浏览记录,带分页
     * @param userId 用户id
     * @param basePage 分页信息
     * @return
     */
    LinkedHashMap<String, List<Video>> getHistory(Long userId, BasePage basePage);

    /**
     * 用户登录时，删除七天前的历史浏览记录
     * @param userId
     * @return
     */
    boolean deleteHistory(Long userId);

    /**
     * 根据视频标签推送相似视频
     * @param video
     * @return
     */
    Collection<Video> listSimilarVideo(Video video);

    /**
     * 获取热度排行榜
     * @return
     */
    Collection<HotVideo> hotRank();

    /**
     * 查询【days】天内的视频，视频id大于【id】，且查询【limit】条记录
     * @param id 视频id，后续要查询的视频id都要在这个id的后面
     * @param days 天数
     * @param limit 每次查询的数量限制
     * @return
     */
    List<Video> listNDaysAgeVideo(long id, int days, int limit);

    /**
     * 获取热门视频
     * @return
     */
    Collection<Video> listHotVideo();

    /**
     * 删除视频
     * @param id 视频id
     */
    void deleteVideo(Long id);

    /**
     * 视频分享
     * @param videoShare
     */
    boolean shareVideo(VideoShare videoShare);

    /**
     * 搜索视频
     * @param search 搜索关键字
     * @param basePage 分页信息
     * @param userId 用户id
     * @return
     */
    IPage<Video> searchVideo(String search, BasePage basePage, Long userId);

    /**
     * 视频审核放行处理
     * @param video
     */
    void auditProcess(Video video);

}
